package com.module.compose.base

import android.os.Bundle
import androidx.activity.compose.setContent
import androidx.compose.runtime.Composable
import androidx.lifecycle.ViewModelProvider
import com.module.compose.base.utils.ToastUtils
import com.module.compose.base.viewModel.OurViewModel
import java.lang.reflect.ParameterizedType


/**
 * 使用compose的基础类
 */
abstract class ComposeActivity<VM : OurViewModel> : BaseActivity() {

    lateinit var viewModel: VM

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        //获取当前对象所表示的类的超类
        val type = javaClass.genericSuperclass

        // 判断一下是否传入了泛型类型
        if (type is ParameterizedType) {

            //如果是泛型类，获取泛型的中第一个class对象，这里只有一个
            val clazz = type.actualTypeArguments[0] as Class<VM>

            //生成viewModel
            viewModel = ViewModelProvider(this).get(clazz)
        } else {
            throw Exception("每个页面必须有对应的viewModel，实在不行把BaseViewModel作为泛型传递过来")
        }

        //设置compose内容填充
        setContent {
            //填充视图，有子类实现
            ContentView()
        }

        //数据初始化
        initData()

        //处理viewModel传递过来的消息(base)
        handleMsg()
    }

    /**
     * 初始化数据，子类实现
     */
    open fun initData() {}

    /**
     * 处理viewModel传递过来的消息(base)
     */
    private fun handleMsg() {
        viewModel.toastMsg.observe(this) {
            ToastUtils.show(it)
        }
    }

    /**
     * 抽象方法，由子类实现
     */
    @Composable
    abstract fun ContentView()
}